import { request as umiRequest } from '@umijs/max';
import { notification } from 'antd';
import { clearToken, setAuthHeader } from './authInterceptor';

const showNotificationError = (message: string, description?: string) => {
  notification.error({
    message,
    description,
  });
};

/**
 * 统一的请求处理函数
 * @param url 请求地址
 * @param options 请求选项
 * @returns Promise
 */
const baseRequest = async (url: string, options: any = {}) => {
  try {
    const headers: Record<string, string> = {
      'Content-Type': 'application/json',
      // 添加请求体token
      // authorization: localStorage.getItem('admin_token'),
      ...options.headers,
    };

    // 添加认证头
    setAuthHeader(headers);

    // 如果URL不是以/api开头，则添加/api前缀
    if (!url.startsWith('/api') && !url.startsWith('http')) {
      url = `/api${url}`;
    }

    console.log('Request URL >>> ', url);

    const response = await umiRequest(url, {
      method: 'GET', // 默认方法
      ...options,
      headers,
      timeout: 30000, // 30秒超时
    });

    // 处理响应数据，umi的request会自动解析响应体
    const responseData = response as any;

    if (responseData && responseData.code !== undefined) {
      switch (responseData.code) {
        case 200: // 成功状态码
          return Promise.resolve(responseData);
        case 401:
          // 登录失效
          if (window.location.pathname !== '/login') {
            // window.location.href = '/login';
            // clearToken();
            showNotificationError('登录已过期', '请重新登录');
          }
          return Promise.reject(new Error('登录已过期'));
        case 403:
          // 权限不足
          showNotificationError('权限不足', '您没有权限执行此操作');
          return Promise.reject(new Error('权限不足'));
        default:
          const errorMessage = responseData.message || '请求失败';
          showNotificationError(errorMessage, `错误码: ${responseData.code}`);
          return Promise.reject(new Error(errorMessage));
      }
    } else {
      // 响应结果不是标准格式，直接返回
      return Promise.resolve(responseData);
    }
  } catch (error: any) {
    console.error('Request error:', error);

    if (error.response) {
      const { status, data } = error.response;
      switch (status) {
        case 401:
          clearToken();
          showNotificationError('登录已过期', '请重新登录');
          // window.location.href = '/login';
          break;
        case 403:
          showNotificationError('权限不足', '您没有权限执行此操作');
          break;
        case 404:
          showNotificationError('请求地址不存在', error.config?.url || url);
          break;
        case 500:
          showNotificationError('服务器内部错误', '请稍后重试');
          break;
        default:
          const errorMessage = data?.message || error.message || '网络请求失败';
          showNotificationError('请求失败', errorMessage);
          break;
      }
    } else if (error.request) {
      showNotificationError('网络连接失败', '请检查网络连接');
    } else {
      showNotificationError('请求失败', error.message || '未知错误');
    }

    return Promise.reject(error);
  }
};

/**
 * 统一的请求函数，支持所有HTTP方法
 * @param url 请求地址
 * @param options 请求选项
 * @returns Promise
 */
// export const request = async (url: string, options: any = {}) => {
//   return baseRequest(url, options);
// };

/**
 * POST 请求
 * @param url 请求地址
 * @param data 请求数据
 * @param options 其他选项
 * @returns Promise
 */
export const post = async (url: string, data?: any, options: any = {}) => {
  return baseRequest(url, {
    method: 'POST',
    data,
    ...options,
  });
};

/**
 * GET 请求
 * @param url 请求地址
 * @param params 查询参数
 * @param options 其他选项
 * @returns Promise
 */
export const get = async (url: string, params?: any, options: any = {}) => {
  return baseRequest(url, {
    method: 'GET',
    params,
    ...options,
  });
};

/**
 * PUT 请求
 * @param url 请求地址
 * @param data 请求数据
 * @param options 其他选项
 * @returns Promise
 */
export const put = async (url: string, data?: any, options: any = {}) => {
  return baseRequest(url, {
    method: 'PUT',
    data,
    ...options,
  });
};

/**
 * DELETE 请求
 * @param url 请求地址
 * @param data 请求数据
 * @param options 其他选项
 * @returns Promise
 */
export const del = async (url: string, data?: any, options: any = {}) => {
  return baseRequest(url, {
    method: 'DELETE',
    data,
    ...options,
  });
};
